package testGuava.example.testSpring.bean;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @ClassName : org.example.testSpring.bean.BaseDao
 * @Description : 类描述
 * Created by cyd on 2021-09-15 17:07:19
 */
public abstract class BaseDao<T> {

    // 在子类调用构造函数时，将泛型信息传给父类
    private final Class<T> clazz;

    /**
     * 在子类调用构造函数时，获取泛型Type，并强转为class
     * 1.获得子类传给父类的泛型Type[]
     * 2.由于子类只传了一个，所以只需要取第一个
     * 3.由Type强转得到真实的class<User>
     */
    public BaseDao() {
        // 由于本类是个抽象类，所以此处this只能是实现类的对象
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        Type actualTypeArgument = genericSuperclass.getActualTypeArguments()[0];
        clazz = (Class<T>) actualTypeArgument;
    }

    // 此时class已经有值了，可以进行一系列操作
    public void getGenericSuperclass() {
        System.out.println(clazz.getName());
    }
}
